package com.cskaoyan.javase.oop3._2inner._1member._0introduction;

/**
 * 在具体研究成员内部类的成员特点之前,我们先明确两个成员内部类的特点:
 *      1.成员内部类为什么可以近似看成该类的一个成员?
 *          对于普通成员而言,它们是属于对象的,需要创建对象,使用对象名点才能够访问
 *          而成员内部类也具有类似的特点:
 *          表面现象: 要想得到成员内部类对象,必须在外围类对象的基础上才能够创建.
 *          为什么?
 *          本质原因: 编译器在编译成员内部类代码时,会自动将外围类对象的引用添加到成员内部类对象的成员变量列表中.
 *          总结:
 *          成员内部类对象依赖于外围类对象而存在
 *          一旦存在成员内部类对象,一定存在外围类对象
 *
 *     2.成员内部类也是一个class,要想创建它的对象,也需要先进行类加载.这时由于成员内部类对象依赖于外围类对象而存在,所以类加载的顺序必然是先外围类,再成员内部类.
 *     综上两点,可以推到出一个结论:
 *     成员内部类没有静态声明.
 *     成员内部类的类加载的触发时机:
 *      基本上只有创建它的对象
 *      因为它没有静态成员,没有静态声明
 *
 *
 * 成员内部类是最普通的内部类，它定义在另一个类的成员位置， 可以看成该类的一个成员.
 * 成员内部类语法
 *
 * //外围类
 * [访问权限修饰符] class EnclosedClazz{
 * //成员内部类
 *   [访问权限修饰符] class InnerClazz{
 *  }
 * }
 *
 * 接下来主要从以下几个角度分析成员内部类的自身特点：
 * 1.访问权限修饰符: 和类中的成员类似,有四种访问权限
 *
 * 2.成员特点,成员内部类本质上仍然是一个class,仍然是一个类,研究:
 *      1.普通成员
 *      2.静态成员
 *      3.构造器
 *      4.代码块
 * 从成员特点上来说,成员内部类当中没有static声明,其他的和普通类一致.
 * 思考:
 *      成员内部类中,有没有全局常量?
 *      有,但只允许字面值常量赋值形式的全局常量
 *
 * 3.继承和实现
 * 可以,既可以定义内部类去继承实现,也可以继承外部的一个类
 * 思考:
 *      如何让一个外部类去继承成员内部类?
 *      本身没有太大意义,作为了解
 *      结论是可以继承,但需要一些操作.
 *
 * @since 10:01
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

// 外围类
class EnclosedClazz {
    // 成员内部类
    class InnerClazz extends A implements IA {
        int a = 10;
        private int b = 20;

        // static int a = 30;
        public void test() {
        }

        // public static void test2(){}
        {
        }
        // static {}

        static final int C = 30;
        static final String STR = "hello";
        // static final String STRING = new String();
        // static int c = 30;
        // static InnerClazz ic = new InnerClazz();

        public InnerClazz(int a, int b) {
            this.a = a;
            this.b = b;
        }

        public InnerClazz() {
        }
    }

    interface IA {
    }

    class A {
    }
}